package com.jsejtman.gastos.service.impl;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.jsejtman.gastos.persistence.dao.CategoriaDao;
import com.jsejtman.gastos.persistence.dao.DaoException;
import com.jsejtman.gastos.persistence.entity.Categoria;
import com.jsejtman.gastos.service.definition.BaseService;
import com.jsejtman.gastos.service.exception.ServiceException;

/**
 * Servicio que permite realizar operaciones con una entidad de datos Categoria.
 * 
 * @author jsejtman
 */
@Service
@Transactional
public class CategoriaService extends BaseService implements ICategoriaService {

	/**
	 * Logger de la aplicación.
	 */
	private static final Logger LOGGER = Logger.getLogger(CategoriaService.class);

	/**
	 * Obtiene una entidad de datos Categoria a través de su identificador.
	 * 
	 * @param id Identificador de la entidad.
	 * @return Entidad de datos Categoria hallada.
	 * @throws ServiceException En caso de problemas.
	 */
	public final Categoria getCategoriaById(final Long id) throws ServiceException {

		if (id == null) {
			throw new ServiceException("El identificador de categoría no fue especificado.");
		}
		try {
			final CategoriaDao dao = this.getDaoFactory().newDao(CategoriaDao.class);

			return (dao.get(Categoria.class, id));

		} catch (final DaoException e) {
			final String mensajeError =
			        "Error al obtener " + Categoria.class.getName() + " con ID = " + id;

			CategoriaService.LOGGER.error(mensajeError, e);

			throw new ServiceException(mensajeError, e);
		}
	}

	/**

	/**
	 * Graba o actualiza el categoria pasado.
	 * 
	 * @param categoria el categoria a grabar.
	 * @throws ServiceException en caso de problemas
	 */
	public final void saveCategoria(final Categoria categoria) throws ServiceException {

		if (categoria == null) {
			throw new ServiceException("La categoria no fue especificada.");
		}
		try {
			final CategoriaDao entityDao = this.getDaoFactory().newDao(CategoriaDao.class);

			entityDao.saveOrUpdate(categoria);

		} catch (final DaoException e) {
			final String mensajeError =
			        "Error al grabar " + Categoria.class.getName() + " categoria = " + categoria;

			CategoriaService.LOGGER.error(mensajeError, e);

			throw new ServiceException(mensajeError, e);
		}

	}

	/**
	 * Borra un categoria.
	 * 
	 * @param categoria la categoria a borrar
	 * @throws ServiceException si ocurre un error.
	 */
	public final void deleteCategoria(final Categoria categoria) throws ServiceException {

		if (categoria == null) {
			throw new ServiceException("La ategoria no fue especificada.");
		}
		try {
			final CategoriaDao entityDao = this.getDaoFactory().newDao(CategoriaDao.class);

			entityDao.delete(categoria);

		} catch (final DaoException e) {
			final String mensajeError =
			        "Error al borrar " + Categoria.class.getName() + " categoria = " + categoria;

			CategoriaService.LOGGER.error(mensajeError, e);

			throw new ServiceException(mensajeError, e);
		}
	}

}
